<?php

/*
 * Lista de Compras
 */

class ListaCompra implements iPersistente, iJson{
    
    private $broker, $id, $propietario, $password, $estado, $compartida, $actual, $nombre;
    private $lineas = Array();
    private $yaPersistido;
    
    public function getNombre(){
        return $this->nombre;
    }
    
    public function setNombre($nombre){
        $this->$nombre = $nombre;        
    }
    
    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getPropietario() {
        return $this->propietario;
    }

    public function setPropietario($propietario) {
        $this->propietario = $propietario;
    }

    public function getPassword() {
        return $this->password;
    }

    public function setPassword($password) {
        $this->password = $password;
    }

    public function getEstado() {
        return $this->estado;
    }

    public function setEstado($estado) {
        $this->estado = $estado;
    }

    public function getCompartida() {
        return $this->compartida;
    }

    public function setCompartida($compartida) {
        $this->compartida = $compartida;
    }

    public function getActual() {
        return $this->actual;
    }

    public function setActual($actual) {
        $this->actual = $actual;
    }

    public function getLineas() {
        return $this->lineas;
    }

    public function setLineas($lineas) {
        $this->lineas = $lineas;
    }

    public function getYaPersistido() {
        return $this->yaPersistido;
    }

    public function setYaPersistido($yaPersistido) {
        $this->yaPersistido = $yaPersistido;
    }

    public function __construct($enJson = null,$i='',$p='',$pwd='',$e='',$c='',$a='',$boolP=false,$n = '') {
        if ( $enJson <> null ){
            $this->checkJson($enJson);
            $lista = json_decode($enJson);
            $this->broker = new Broker();
            $this->id = $lista->id;
            $this->propietario = new Usuario(json_encode($lista->propietario));
            $this->password = $lista->password;
            $this->estado = $lista->estado;
            $this->compartida = $lista->compartida;
            $this->actual = $lista->actual;
            $this->yaPersistido = $lista->yaPersistido;
            $this->nombre = $lista->nombre;            
        }else{
            $this->broker = new Broker();
            $this->id = $i;
            $this->propietario = $p;
            $this->password = $pwd;
            $this->estado = $e;
            $this->compartida = $c;
            $this->actual = $a;
            $this->yaPersistido = $boolP; 
            $this->nombre = $n;
        }       
    }
    
    public function borrar() {
        $this->broker->borrar("DELETE FROM listacompra WHERE id = \"".$this->id."\"");
        for ( $i=0; $i< sizeof($this->lineas); $i++ ){
            $this->lineas[$i].borrar();
        }
    }
    public function guardar() {
        if ( $this->yaPersistido == 'true' ){
            $this->broker->guardar("UPDATE listacompra set estado = \"".$this->estado."\", compartida = \"".$this->compartida."\", actual = \"".$this->actual."\" WHERE id = \"".$this->id."\"");
        }else{
            //actualizo las otras listas del usuario con estado actual en true;
            $this->broker->guardar("UPDATE listacompra set actual = \"false\", estado = \"cerrado\" WHERE propietario = \"".$this->propietario->getNombreUsuario()."\"");
            $this->broker->guardar("INSERT INTO listacompra (password,propietario,estado,compartida,actual,nombre) VALUES
                                   (\"".md5($this->password)."\",\"".$this->propietario->getNombreUsuario()."\",\"".$this->estado."\",".$this->compartida.",\"".$this->actual."\",\"".$this->nombre."\")");
            $this->id = $this->broker->UltimoID();           
            $this->yaPersistido = true;
        }
        //Guardo las lineas, no manejo transacciones por falta de tiempo para leer en php.net la forma correcta de hacerlo
        for ( $i=0; $i< sizeof($this->lineas);$i++ ){
            $this->lineas[$i]->setListacompra($this);
            $this->lineas[$i]->guardar();
        }
    }
    public function obtenerTodos() {
        $this->broker->obtenerTodos("Select * from listacomprafull order by listacompraid");        
        $dato = $this->broker->Siguiente(); 
        
        $listacompraAnterior = new ListaCompra();
        $retorno = Array();
        
        $lineas = Array();
        $linealista;
        $articulo;
                
        while ( $dato <> null ){
            if ( $dato["listaCompraId"] <> $listacompraAnterior->getId() ){
                $usuario = new Usuario(null,$dato["usuarioNombre"], $dato["nombreDeUsuario"], "", $dato["usuarioEmail"], true);
                $listacompraAnterior = new ListaCompra(null,$dato["listaCompraId"], $usuario, "", $dato["listaCompraEstado"], $dato["listaCompraCompartida"], $dato["listaCompraActual"], true, $dato["listaCompraNombre"]);
                $retorno[] = $listacompraAnterior;
                $lineas = Array();                
            }
            
            $articulo = new Articulo(null,$dato["articuloId"], $dato["articuloNombre"], true);
            $linealista = new LineaLista(null,$dato["lineaListaId"], $listacompraAnterior, $articulo, $dato["lineaListaCantidad"], true,$dato["lineaListaComprado"]);
            
            $lineas[] = $linealista;
            $dato = $this->broker->Siguiente();
            if ( $dato["listaCompraId"] <> $listacompraAnterior->getId() ){
                $listacompraAnterior->setLineas($lineas);
            }
        }
        $this->broker->Libero();
        return $retorno;
    }
    public function obtenerXid($id) {
        $this->broker->obtenerTodos("Select * from listacomprafull where listaCompraId = \"$id\" order by listaCompraId");        
        $dato = $this->broker->Siguiente(); 
        
        $listacompraAnterior = new ListaCompra();
        $retorno = Array();
        
        $lineas = Array();
        $linealista;
        $articulo;
                
        while ( $dato <> null ){
            if ( $dato["listaCompraId"] <> $listacompraAnterior->getId() ){
                $usuario = new Usuario(null,$dato["usuarioNombre"], $dato["nombreDeUsuario"], "", $dato["usuarioEmail"], true);
                $listacompraAnterior = new ListaCompra(null,$dato["listaCompraId"], $usuario, "", $dato["listaCompraEstado"], $dato["listaCompraCompartida"], $dato["listaCompraActual"], true,$dato["listaCompraNombre"]);
                $retorno[] = $listacompraAnterior;
                $lineas = Array();
                
            }
            
            $articulo = new Articulo(null,$dato["articuloId"], $dato["articuloNombre"], true);
            $linealista = new LineaLista(null,$dato["lineaListaId"], $this, $articulo, $dato["lineaListaCantidad"], true, $dato["lineaListaComprado"]);
            $lineas[] = $linealista;
                        
            $dato = $this->broker->Siguiente();
            if ( $dato["listaCompraId"] <> $listacompraAnterior->getId() ){
                $listacompraAnterior->setLineas($lineas);
            }
        }
        $this->broker->Libero();
        return $retorno;
    }

    public function toJson() {
        $ret = new stdClass();
        $ret->actual = $this->actual;
        $ret->compartida = $this->compartida;
        $ret->estado = $this->estado;
        $ret->id = $this->id;
        $ret->nombre =  $this->nombre;
        
        $l = Array();
        for ( $i=0;$i<sizeof($this->lineas);$i++ ){
            $aux = $this->lineas[$i];
            $l[] = $aux->toJson();            
        }
        $ret->lineas = $l;
        $ret->password = $this->password;
        $ret->propietario = $this->propietario->toJson();
        $ret->yaPersistido = $this->yaPersistido;
        return $ret;
    }
    
    public function checkJson($s) {
        $elem = json_decode($s);
        if ( !isset($elem->id) || !isset($elem->propietario) || !isset($elem->password) ||
                !isset($elem->estado) || !isset($elem->compartida) || !isset($elem->actual) ||
                !isset($elem->yaPersistido) || !isset($elem->nombre)){
            throw new Exception("Obj. ListaCompra JSon Invalido");
        }
    }
}

?>
